#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
void write(int x)
{
	if(x<0)x=-x,putchar('-');
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int n,k;
int a[10000005];
int f[10000005];
const int mod=1e9+7;
int Pow[10000005];
int ans;
namespace Nene
{
	struct segt
	{
		int val,minn,tag;
		segt(){val=minn=1e17;}
	}t[500005<<2];
	#define ls (root<<1)
	#define rs (root<<1|1)
	#define mid (l+r>>1)
	void down(int root)
	{
		if(!t[root].tag) return;
		t[ls].tag=t[root].tag;
		t[rs].tag=t[root].tag;
		t[ls].minn=t[ls].val+t[root].tag;
		t[rs].minn=t[rs].val+t[root].tag;
		t[root].tag=0;
	}
	void insert(int x,int v,int root=1,int l=0,int r=n)
	{
		if(l==r)
		{
			t[root].val=t[root].minn=v;
			return;
		}
		down(root);
		if(x<=mid) insert(x,v,ls,l,mid);
		else insert(x,v,rs,mid+1,r);
		t[root].minn=min(t[ls].minn,t[rs].minn);
		t[root].val=min(t[ls].val,t[rs].val);
	}
	void add(int x,int y,int v,int root=1,int l=0,int r=n)
	{
		if(l>=x&&r<=y)
		{
			t[root].minn=t[root].val+v;
			t[root].tag=v;
			return;
		}
		down(root);
		if(x<=mid) add(x,y,v,ls,l,mid);
		if(y>mid) add(x,y,v,rs,mid+1,r);
		t[root].minn=min(t[ls].minn,t[rs].minn);
	}
	int query(int x,int y,int root=1,int l=0,int r=n)
	{
		if(l>=x&&r<=y) return t[root].minn;
		int res=1e18;
		down(root);
		if(x<=mid) res=min(res,query(x,y,ls,l,mid));
		if(y>mid) res=min(res,query(x,y,rs,mid+1,r));
		return res;
	}
	#undef ls
	#undef rs
	#undef mid
}
using namespace Nene;
int stk[10000005],top;
signed main()
{
	freopen("knight.in","r",stdin);
	freopen("knight.out","w",stdout);
	n=read(),k=read();
	for(int i=1;i<=n;i++) a[i]=read();
	memset(f,0x3f,sizeof f);
	insert(0,0);
	f[0]=0;
	stk[++top]=0;
	for(int i=1;i<=n;i++)
	{
		while(top&&a[stk[top]]<=a[i]) --top;
		stk[++top]=i;
		int l=1,r=top,res=0;	
		while(l<=r)
		{
			int mid=l+r>>1;
			if(a[stk[mid]]>a[i]) l=mid+1,res=stk[mid];
			else r=mid-1;
		}
		add(res,i-1,a[i]);
		f[i]=query(max(0ll,i-k),i-1);
		insert(i,f[i]);
	}
	Pow[0]=1;
	for(int i=1;i<=n;i++) Pow[i]=Pow[i-1]*23%mod;
	for(int i=1;i<=n;i++) ans=(ans+f[i]%mod*Pow[n-i])%mod;
	write(ans);
	return 0;
}
